package com.xadrez.view;

import com.xadrez.Principal;
import com.xadrez.modelo.Posicao;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TabuleiroView extends JPanel {

    private Dimension quadrados;
    private List<PecaView> pecas;
    private static TabuleiroView instance = null;
    private Color cor;
    private List<MapeadorDePosicao> mapaDePosicoesVirtuais;
    public final int TAMANHOTABULEIRO = 600;
    public final int TAMANHOQUADRADO = TAMANHOTABULEIRO / 8;

    public synchronized static TabuleiroView getInstance() {
        if (instance == null) {
            instance = new TabuleiroView();
        }
        return instance;
    }

    public TabuleiroView() {
        setLayout(new GridLayout(8, 8));

        quadrados = new Dimension(TAMANHOTABULEIRO, TAMANHOTABULEIRO);
        setPreferredSize(quadrados);
        setBounds(0, 0, quadrados.width, quadrados.height);
        pecas = new ArrayList<PecaView>();
        mapaDePosicoesVirtuais = new ArrayList<MapeadorDePosicao>();
    }

    public PecaView buscaPeca(int x, int y) {
        Component c = TabuleiroView.getInstance().findComponentAt(x, y);
        PecaView peca = null;

        if (c instanceof JLabel) {
            JLabel imagem = (JLabel) c;

            for (PecaView pecaCorrente : pecas) {
                if (pecaCorrente.getImagem() == imagem) {
                    peca = pecaCorrente;
                }
            }
        }
        return peca;
    }

    public MapeadorDePosicao recuperaMapaDePosicao(int mouseX, int mouseY) {
        Component componentTemp = TabuleiroView.getInstance().findComponentAt(mouseX, mouseY);
        int xView = Mouse.getX(componentTemp);
        int yView = Mouse.getY(componentTemp);
        //int xView = componentTemp.getParent().getX();
        //int yView = componentTemp.getParent().getY();
                
        for (MapeadorDePosicao mP : mapaDePosicoesVirtuais) {
            if (mP.getPosicaoView().getX() == xView && mP.getPosicaoView().getY() == yView) {
                return mP;
            }
        }
        return null;
    }

    public MapeadorDePosicao recuperaMapaDePosicao(PecaView pecaView) {
        MapeadorDePosicao resposta = null;
        Posicao posicaoDaPeca = pecaView.getPeca().getPosicaoNoTabuleiro();

        for (MapeadorDePosicao mP : mapaDePosicoesVirtuais) {
            if (mP.getPosicaoReal().getX() == posicaoDaPeca.getX()
                    && mP.getPosicaoReal().getY() == posicaoDaPeca.getY()) {
                resposta = mP;
            }
        }
        return resposta;
    }

    //Verifica se existe adversário na posição x,y;
    public boolean temAdversarioNaPosicao(int x, int y) {
        MapeadorDePosicao mP = TabuleiroView.getInstance().recuperaMapaDePosicao(x, y);
        return Principal.getTabuleiro().temAdversarioNaPosicao(mP.getPosicaoReal().getX(), mP.getPosicaoReal().getY());
    }

    //Verifica se existe peça do jogador humano na posição x,y;
    public boolean temPecaDoJogadorNaPosicao(int x, int y) {
        MapeadorDePosicao mP = TabuleiroView.getInstance().recuperaMapaDePosicao(x, y);
        return Principal.getTabuleiro().temPecaDoJogadorNaPosicao(mP.getPosicaoReal().getX(), mP.getPosicaoReal().getY());
    }

    public Dimension getQuadrados() {
        return quadrados;
    }

    public void setQuadrados(Dimension quadrados) {
        this.quadrados = quadrados;
    }

    public Color getCor() {
        return cor;
    }

    public void setCor(Color cor) {
        this.cor = cor;
    }

    public List<PecaView> getPecas() {
        return pecas;
    }

    public void setPecas(List<PecaView> pecas) {
        this.pecas = pecas;
    }

    public List<MapeadorDePosicao> getMapaDePosicoesVirtuais() {
        return mapaDePosicoesVirtuais;
    }

    public void setMapaDePosicoesVirtuais(List<MapeadorDePosicao> mapaDePosicoesVirtuais) {
        this.mapaDePosicoesVirtuais = mapaDePosicoesVirtuais;
    }
}
